package com.ai.networking.netty.handler;


import com.ai.common.constant.Constants;
import com.ai.networking.netty.service.NettyServer;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;

import java.net.InetSocketAddress;

/**
 * @Author jiaok
 * @Date 2023-06-16 16:09
 */
@Slf4j
public class HearBeatHandler extends ChannelInboundHandlerAdapter {

    private Long heartBeatTime = 30000L;//心跳时间
//
//    public HearBeatHandler(Long heartBeatTime) {
//        this.heartBeatTime = heartBeatTime;
//    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        //判断evt的事件类型,是否为心跳抛出的读、写、读写空闲
        if (evt instanceof IdleStateEvent){

            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state()== IdleState.READER_IDLE){
//                log.info("================================  进入读空闲...  ================================");
            }
            else if (event.state() == IdleState.WRITER_IDLE) {
//                log.info("================================  进入写空闲...  ================================");
            } else if (event.state() == IdleState.ALL_IDLE) {
                log.info("================================  进入全空闲...  ================================");
               //获取上次读取心跳的时间 ------  判断是否需要将当前信道踢出
                Long lastReadTime = (Long) ctx.channel()
                        .attr(AttributeKey.valueOf(Constants.ReadTime)).get();
                log.info("================================  上次时间发生时间"+ lastReadTime.toString() +"================================");
                long currentTimeMillis = System.currentTimeMillis();
                log.info("================================  上次时间发生时间"+ currentTimeMillis +"================================");
                if (currentTimeMillis - lastReadTime > this.heartBeatTime){
//                    //移除channel
//                    new ServerHandler().channelInactive(ctx);
                    //主动断开连接 , 当channel断开连接时触发channelInactive，并移除内存中的channel，这里不需要冗余移除
                    ctx.close();
                }
            }
        }

        super.userEventTriggered(ctx, evt);
    }
}
